package com.多线程.ThreadPool;


import java.util.concurrent.*;

/**
 * 目标：自定义一个线程池对象，处理Callable任务（有返回值）
 */

public class TreadPoolDemo2 {
    public static void main(String[] args) throws Exception {
        //1.创建一个线程池对象
        /**
         int corePoolSize,
         int maximumPoolSize,
         long keepAliveTime,
         TimeUnit unit,
         BlockingQueue<Runnable> workQueue,
         ThreadFactory threadFactory,
         RejectedExecutionHandler handler
         */
        ExecutorService pool=new ThreadPoolExecutor(3,5,6, TimeUnit.SECONDS,
                new ArrayBlockingQueue<>(5),new ThreadPoolExecutor.AbortPolicy());


        //2.创建Callable任务交给线程池处理(任务只要创建一个就好了，这里表示的是让线程池处理多个任务)
//        MyCallable callable=new MyCallable(1000);
//        //Callable任务不能直接交给线程处理，要先交给FutureTask处理
//        FutureTask<String > task=new FutureTask<>(callable);
//        //将FutureTask对象交给线程池中的线程处理
//        pool.execute(task);
//        System.out.println(task.get());
//        pool.execute(task);
//        pool.execute(task);
//        pool.execute(task);
//        pool.execute(task);
//        pool.execute(task);
//        pool.execute(task);
//        pool.execute(task);
        //线程池执行完任务以后是不会关闭的，实际开发中也不会去关闭线程池
        //任务数量少于8个是不会创建临时线程的
//        pool.execute(task);
        //数量大于8个就会创建临时线程

        //当任务数量大于10的时候任务会被拒绝（这里我们使用的是抛出异常的方法）
        //Running, pool size = 5, active threads = 5, queued tasks = 5, completed tasks = 0  提示已经完成的线程数量是0

        //关闭线程池
//        pool.shutdownNow();//立即关闭，任务没完成也关闭
//        pool.shutdown();//等任务执行完以后在关闭

        //使用submit方法提交任务
        Future<String> task1 = pool.submit(new MyCallable(100));
        Future<String> task2 = pool.submit(new MyCallable(200));
        Future<String> task3= pool.submit(new MyCallable(300));
        Future<String> task4 = pool.submit(new MyCallable(400));

        //获取线程返回的结果
        System.out.println(task1.get());
        System.out.println(task2.get());
        System.out.println(task3.get());
        System.out.println(task4.get());
        //pool-1-thread-1计算1-100的和，结果是：5050
        //pool-1-thread-2计算1-200的和，结果是：20100
        //pool-1-thread-3计算1-300的和，结果是：45150
        //pool-1-thread-1计算1-400的和，结果是：80200


    }
}
